<?php

use Config\Redis;
use \GatewayWorker\Lib\Db;

class base_module{

    protected $paras;
    protected $result = array(
        'state' => 404,
        'msgid' => 404,
    );

    public function __construct()
    {
        $this->paras = $_REQUEST;
        $this->paras['remoteip'] = $this->clientIP();//bindec(decbin(ip2long($_SERVER['REMOTE_ADDR'])));
    }

    # region Redis操作

    /**
     * 取Redis的值
     * @param $Redis object redis对象
     * @param $key string 要取值的redis字段名
     * @return mixed string|ing|array
     */
    public function redisGet($Redis, $key){
        $value = $Redis -> get($key);
        $value_serl = @unserialize($value);
        if(is_object($value_serl)||is_array($value_serl)){
            return $value_serl;
        }
        return $value;
    }

    /**
     * 设置Redis数据
     * @param $Redis object redis对象
     * @param $key string 字段名
     * @param $value key对应的值（string|int|array）
     * @return mixed
     */
    public function redisSet($Redis, $key, $value){
        if(is_object($value)||is_array($value)){
            $value = serialize($value);
        }
        return $Redis->set($key,$value);
    }
    /**
     * 设置有时效性的Redis数据
     * @param $Redis object redis对象
     * @param $key string 字段名
     * @param $value key对应的值（string|int|array）
     * @param $value int 过期时间（秒）
     * @return mixed
     */
    public function redisSetEx($Redis, $key, $value, $expire = 86400){
        if(is_object($value)||is_array($value)){
            $value = serialize($value);
        }
        return $Redis->setex($key,$expire,$value);
    }

    /**
     * 检测LIST虽否存在对应的值
     * @param $redis object Redis对象
     * @param $key string 要查找的Redis键名
     * @param $value string 要检测的键值
     * @param int $Addition_subtraction 统计列表时是否加减总数
     * @return bool
     */
    public function existsRedisKey($redis, $key, $value)
    {
        $isHaveNuo = false;
        $_total = $redis->llen($key);
        $redis_key_index = 0;
        $redis_key_count = $_total;
        while($redis_key_index < $redis_key_count){
            $redis_key_item = $redis->lindex($key, $redis_key_index);
            if($redis_key_item == $value)
            {
                $isHaveNuo = true;
            }
            $redis_key_index++;
        }
        return $isHaveNuo;
    }

    public function roundFromRedisKey($redis, $key)
    {
        $key_count = $redis->llen($key);
        $key_index = mt_rand(0, $key_count);
        $result = $redis->lindex($key, $key_index);
        # 从KEY中删除
        $redis->lrem($key, $key_index, 1);
        return $result;
    }
    # endregion


    /*
	* 检测数组中是否包含KEY这个键
	* @param string $key 键名
	* @param array $arr 待检测的数组
	* @param string $dataType 返回值的类型 默认是数值型
	* @param object $result 返回按$isNumeric指定的类型值
	*/
    protected function existsKey($key,$arr,$dataType='N',$default=0){
        $result = '';
        if(is_array($arr) && count($arr)>0 && array_key_exists($key,$arr)){
            switch($dataType){
                case 'N':
                    $result = intval($arr[$key]);
                    break;
                case "S": //字符型
                    $result = strval($arr[$key]);
                    break;
                case 'D': //日期型 2017-10-11
                    $result = date('Y-m-d',strtotime($arr[$key]));
                    break;
                case 'F': //货币数字
                    $result = floatval($arr[$key]);
                    break;
            }
        }else{
            switch($dataType){
                case 'N':
                    $result = $default ? $default : 0;
                    break;
                case "S": //字符型
                    $result = $default ? $default : '';
                    break;
                case 'D': //日期型 2017-10-11
                    $result = $default ? $default : '';
                    break;
                case 'F': //货币数字
                    $result = $default ? $default : 0;
                    break;
            }
        }
        return $result;
    }

    public function clientIP() {
        //strcasecmp 比较两个字符，不区分大小写。返回0，>0，<0。
        /*
        if(getenv('HTTP_X_REAL_IP') && strcasecmp('HTTP_X_REAL_IP','NULL')){
            $ip = getenv['HTTP_X_REAL_IP'];
        }elseif(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            $ip = getenv('REMOTE_ADDR');
        } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        */
        $ip = $_SERVER['REMOTE_ADDR'];
        $res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
        $res = bindec(decbin(ip2long($res)));
        return $res;
    }
    public function base64EncodeImage($image_file) {
        $base64_image = '';
        $image_info = getimagesize($image_file);
        $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
        $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
        return $base64_image;
    }
}